﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Logica;
using ClienteWinMGI.Presentacion;
using ComunesMGI.Mensajes;

namespace ClienteWinMGI.Presentacion
{
    public partial class ReporteIncidentesAsignadosPeriodo : Form
    {
        private const string TODOS_LOS_ESTADOS = "<Todos los Estados>";
        private const string TODOS_LOS_CLIENTES = "<Todos los Clientes>";
        private const string TODOS_LOS_SISTEMAS = "<Todos los Sistemas>";
        private List<DataUsuario> _usuarios;
        private List<DataSistema> _sistemasDeCliente;
        private List<DataCliente> _clientes;

        public ReporteIncidentesAsignadosPeriodo()
        {
            InitializeComponent();
            CargarEstados();
            CargarUsuarios();
            CargarClientes();
            ClearValidator();
            HideLoader();
        }

        private void ShowLoader()
        {
            picLoader.Visible = true;
        }
        private void HideLoader()
        {
            picLoader.Visible = false;
        }

        private void ClearValidator()
        {
            imgValidator.Visible = false;
            lblValidator.Visible = false;
        }

        private void ShowValidator(string textoValidator)
        {
            imgValidator.Visible = true;
            lblValidator.Visible = true;
            lblValidator.Text = textoValidator;
        }

        private void CargarUsuarios()
        {
            IUsuarios iu = LogicaFactory.getInstance().getIUsuarios();
            _usuarios = iu.GetUsuarios();
            for (int i = 0; i < _usuarios.Count(); i++)
            {
                string nombreUsuario = _usuarios[i].Nombre;
                nombreUsuario.Replace(" ", "");
                cboUsuario.Items.Add(nombreUsuario);
            }
        }

        private void CargarEstados()
        {
            List<DataCliente> _ldc;
            IClientes _il = LogicaFactory.getInstance().getIClientes();
            _ldc = _il.GetClientes();
            ISistemas _sist = LogicaFactory.getInstance().getISistemas();
            List<DataSistema> _lsist = _sist.GetSistemas(_ldc.First().Codigo);
            DataSistema actualDs = _lsist.First();
            IIncidentes il = LogicaFactory.getInstance().getIIncidentes();
            List<DataCampo> dataCampos = il.GetCampos(actualDs.Codigo, ComunesMGI.Enums.Lista.Incidentes);
            DataCampo datac = dataCampos.First(dc => dc.Titulo == "Estado");
            cboEstado.Items.Add(TODOS_LOS_ESTADOS);
            cboEstado.SelectedIndex = cboEstado.Items.IndexOf(TODOS_LOS_ESTADOS);
            foreach (string vc in datac.Opciones)
            {
                cboEstado.Items.Add(vc);
            }

        }

        private void CargarClientes()
        {
            cboCliente.Items.Add(TODOS_LOS_CLIENTES);
            cboCliente.SelectedIndex = cboCliente.Items.IndexOf(TODOS_LOS_CLIENTES);
            List<DataCliente> _ldc;
            IClientes _il = LogicaFactory.getInstance().getIClientes();
            _ldc = _il.GetClientes();
            foreach (DataCliente dc in _ldc)
            {
                cboCliente.Items.Add(dc.Nombre);
            }
            _clientes = _ldc;
        }

        private void cboCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            ClearValidator();
            cboSistema.Items.Clear();
            cboSistema.Items.Add(TODOS_LOS_SISTEMAS);
            cboSistema.SelectedIndex = cboSistema.Items.IndexOf(TODOS_LOS_SISTEMAS);
            if (cboCliente.SelectedIndex != cboCliente.Items.IndexOf(TODOS_LOS_CLIENTES))
            {
                DataCliente actualDc = _clientes.First(ds => ds.Nombre == cboCliente.SelectedItem.ToString());
                ISistemas _sist = LogicaFactory.getInstance().getISistemas();
                List<DataSistema> _lista = _sist.GetSistemas(actualDc.Codigo);
                for (int i = 0; i < _lista.Count(); i++)
                {
                    DataSistema _dataSist = _lista[i];
                    string item = _dataSist.Nombre;
                    cboSistema.Items.Add(item);
                }
                _sistemasDeCliente = _lista;
            }
        }

        private void btnReporte_Click(object sender, EventArgs e)
        {
            ShowLoader();
            this.Refresh();
            this.Update();
            ClearValidator();
            if (cboUsuario.SelectedIndex != -1)
            {
                if (dTPFechaDesde.Value.Date.CompareTo(dTPFechaHasta.Value.Date) <= 0)
                {
                    DataCliente _datoCliente = null;
                    if (cboCliente.SelectedIndex != cboCliente.Items.IndexOf(TODOS_LOS_CLIENTES))
                        _datoCliente = new DataCliente(cboCliente.SelectedItem.ToString());

                    DataSistema _datoSistema = null;
                    if (cboSistema.SelectedIndex != cboSistema.Items.IndexOf(TODOS_LOS_SISTEMAS))
                    {
                        _datoSistema = _sistemasDeCliente.First(ds => ds.Nombre == cboSistema.SelectedItem.ToString());
                    }
                    String _datoEstado = null;
                    if (cboEstado.SelectedIndex != cboEstado.Items.IndexOf(TODOS_LOS_ESTADOS))
                    {
                        _datoEstado = cboEstado.SelectedItem.ToString();
                    }

                    IIncidentes _inc = LogicaFactory.getInstance().getIIncidentes();
                    string nombreUsuario = cboUsuario.SelectedItem.ToString();
                    nombreUsuario = nombreUsuario.Trim();
                    List<int> sistemas = new List<int>();
                    if (_datoSistema != null)
                    {
                        sistemas.Add(_datoSistema.Codigo);
                    }
                    List<DataIncidenteReporte> _liap = _inc.VisualizarIncidentesAsignados(sistemas, nombreUsuario, _datoEstado, dTPFechaDesde.Value, dTPFechaHasta.Value);
                    if (_liap != null && _liap.Count > 0)
                    {
                        FormReportes fr = new FormReportes();
                        fr.SetReporteAsignadosPeriodos();
                        fr.SetDataSourceReporteIncidentesAsignados(_liap, dTPFechaDesde.Value, dTPFechaHasta.Value);
                        fr.ShowDialog();
                    }
                    else
                    {
                        MsgError err = new MsgError("Error", "No existen incidentes asignados para el periodo seleccionado.", "Modifique el periodo en el cual quiere visualizar los incidentes asignados al usuario para poder generar el reporte.");
                        err.ShowDialog();
                    }
                }
                else
                {
                    HideLoader();
                    MsgError err = new MsgError("Error", "Período de tiempo incorrecto.", "La fecha de Inicio debe ser menor o igual a la fecha de fin del periodo. Modifique el periodo en el cual quiere visualizar los incidentes creados para poder generar el reporte.");
                    err.ShowDialog();
                }
            }
            else
            {
                ShowValidator("El campo del usuario no puede ser vacío");
            }
            HideLoader();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cboUsuario_SelectedIndexChanged(object sender, EventArgs e)
        {
            cboCliente.Enabled = true;
            cboSistema.Enabled = true;
        }

    }
}
